/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package GenerateDB;

import JDBC.UtilsJDBC;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author escabia
 */
public class ScriptSQL extends Script{
    
    private String esquema = null;
    private HashMap<String, ArrayList<String> > clavesprimarias = null;
    private HashMap<String,Integer> tiposespecializaciones = null;
    
    private ArrayList<ArrayList<Tabla> > tablas;
    
    public ScriptSQL(String esquema, HashMap<String, ArrayList<String> > clavesprimarias){
        this.esquema = esquema;
        this.clavesprimarias = clavesprimarias;
        this.tiposespecializaciones = tiposespecializaciones;
        tablas = new ArrayList<>();
        
        
        /** Algoritmo **/
        UtilsJDBC selects = new UtilsJDBC();
        
        
        /** ENTIDADES **/
        tablas.add(selects.getEntitys(esquema));//Añade a tablas las entidades
        for(int i=0; i<tablas.get(0).size(); i++){
            tablas.get(0).get(i).setPK(clavesprimarias.get(tablas.get(0).get(i).getNombre()));//Añade PK a tabla
        }
        
        /** ENTIDADES DÉBILES **/
        tablas.add(selects.getWeakEntitys(esquema,clavesprimarias));//Añade a tablas las entidades
        selects.addColumnsPKtoWE(esquema,clavesprimarias,tablas); //Añade las claves primarias a las entidades débiles que dependen directamente de fuerte.
        selects.addColumnsPKtoWE(esquema,tablas); //Añade las claves primarias a las entidades débiles que dependen directamente de fuerte.
        
        
        /** RELACIONES **/
        tablas.add(selects.relbinarys(esquema, tablas, clavesprimarias));
        
        /** ATRIBUTO MULTIVALUADO **/
        tablas.add(selects.multivaluado(esquema,clavesprimarias));
        
                
        /** ESPECIALIZACIONES **/


        
        selects.disconnect();
    }    
    
    /**
     * @param esquema
     * @param ruta 
     */
    public void generate(String esquema, String ruta){
        try {
            this.script = new PrintWriter(ruta);
            for(int j=0; j<tablas.size(); j++){
                for(int i=0; i<tablas.get(j).size(); i++){
                    this.script.println(tablas.get(j).get(i).toCREATE()); //Depuración
                }
            }
            for(int j=0; j<tablas.size(); j++){
                for(int i=0; i<tablas.get(j).size(); i++){
                    this.script.println(tablas.get(j).get(i).toFK()); //Depuración
                }
            }            
            
            this.script.flush();
            
            
            
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ScriptSQL.class.getName()).log(Level.SEVERE, null, ex);
        }
        this.script.close();
    }
}
